package org.example.filter;

import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.example.utils.JwtUtils;

import java.io.IOException;


/*
* 拦截器，用于拦截所有请求，判断请求中是否包含token，如果包含，就解析token，如果解析失败，就返回401
* */
@Slf4j
@WebFilter(urlPatterns = "/*")
public class TokenFilter implements Filter {

    // 处理登录拦截
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 1.获取请求URL
        String url = request.getRequestURI().toString();

        // 2.判断URL中是否包含Login 如果包含登录操作，直接放行
        if(url.contains("login")) {
            log.info("登录请求，直接放行");
            filterChain.doFilter(request, response);
            return;
        }

        // 3.获取请求头中的令牌（token）
        String token = request.getHeader("token");

        // 4.判断令牌是否存在，如果不存在，直接返回401
        if(token == null || token.isEmpty()) {
            log.info("令牌为空，响应401");
            response.setStatus(401);
            return;
        }

        // 5.如果令牌存在，就解析令牌
        try {
            Claims claims = JwtUtils.parseJwt(token);
            log.info("令牌解析成功：{}", claims);
            // 6.如果解析成功，就放行
            filterChain.doFilter(request, response);
        } catch (Exception e) {
            // 7.如果解析失败，就返回401
            log.info("令牌解析失败，响应401");
            response.setStatus(401);
        }
    }
}
